home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Cream of the Crop 25
/
Cream of the Crop 25.iso
/
os2
/
kzr0597.zip
/
N!!.CMD
< prev
next >
Wrap
OS/2 REXX Batch file
|
1997-02-10
|
3KB
|
92 lines
/* REXX-Funktion n!!.CMD */
"@ echo off"
Call RxFuncAdd 'SysLoadFuncs', RexxUtil, 'SysLoadFuncs'
Call SysLoadFuncs
signal on syntax name n!!Msg
/* Diese Variablen müssen für jede Prozedur definiert werden, damit die */
/* Prozedur die Variable bufND kennt und die Variable ND übernehmen kann.*/
Pfd=SysSearchPath("PATH", "kzr.cmd")
lp=LastPos("\", Pfd)
Pfd=DelStr(Pfd, 1+lp)
bufND =Pfd||"NDZahl.DAT"
bufMsg=Pfd||"Meldung.DAT"
ND = LineIn(bufND, 1)
parse arg n,y
p0p=n*n /* Diese Anweisung provoziert eine Syntax-Fehlermeldung */
if length(y) > 0 then
do
ret=LineOut(bufMsg, "Im Argument von n!!(...) ist mindestens 1 nicht zulässiges Komma !")
/* "bufMsg" und "bufND" werden immer beim Beenden von kzr.cmd gelöscht, */
/* damit in den diesbezüglichen temporären Dateien */
/* Meldungen und ND-Werte nicht aneinandergehängt werden. */
EXIT
end
if n=0 | n=-1 then do u=1; Signal W; end
if n < -1 then
do
ret=LineOut(bufMsg, "Das Argument der Funktion n!!(...) muß größer als -2 sein !")
/* "bufMsg" und "bufND" werden immer beim Beenden von kzr.cmd gelöscht, */
/* damit in den diesbezüglichen temporären Dateien */
/* Meldungen und ND-Werte nicht aneinandergehängt werden. */
EXIT
end
if n > 6000 then
do
ret=LineOut(bufMsg, "Das Argument der Funktion n!!(...) sollte 6000 nicht überschreiten,",
" ",
"weil sonst die Rechenzeit zu groß werden würde.")
/* "bufMsg" und "bufND" werden immer beim Beenden von kzr.cmd gelöscht, */
/* damit in den diesbezüglichen temporären Dateien */
/* Meldungen und ND-Werte nicht aneinandergehängt werden. */
EXIT
end
nn=n//1
if nn <> 0 then
do
ret=LineOut(bufMsg, "Das Argument der Funktion n!!(...) muß eine ganze Zahl sein !")
/* "bufMsg" und "bufND" werden immer beim Beenden von kzr.cmd gelöscht, */
/* damit in den diesbezüglichen temporären Dateien */
/* Meldungen und ND-Werte nicht aneinandergehängt werden. */
EXIT
end
Numeric Digits ND+10
u=n; i=1
do while n-2*i > 0
u=u*(n-2*i)
i=i+1
end
W:
numeric digits ND
return(Format(u))
n!!Msg:
sf=ErrorText(RC)
if Pos("Arithmetic overflow", sf) > 0 | Pos("Invalid whole", sf) >0 then
do
ret=LineOut(bufMsg, "Es müssen zu große Zahlenwerte verarbeitet werden !")
/* "bufMsg" und "bufND" werden immer beim Beenden von kzr.cmd gelöscht, */
/* damit in den diesbezüglichen temporären Dateien */
/* Meldungen und ND-Werte nicht aneinandergehängt werden. */
EXIT
end
if Pos("Bad arithmetic conversion", sf) > 0 then
do
ret=LineOut(bufMsg, "Sie haben in n!!(...) kein gültiges Argument eingegeben !")
/* "bufMsg" und "bufND" werden immer beim Beenden von kzr.cmd gelöscht, */
/* damit in den diesbezüglichen temporären Dateien */
/* Meldungen und ND-Werte nicht aneinandergehängt werden. */
EXIT
end